#ifndef BAZA_H
#define BAZA_H

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QtDebug>
#include <QString>
#include <QObject>
#include <QVariant>

#include <baza/artikl.h>
#include <baza/grupa.h>
#include <baza/popis.h>
#include <baza/elementpopisa.h>

#include <baza/jezik.h>

class Baza : public QObject { //da bi se moglo predati v qml, klasa mora nasljedjivati qobject
    Q_OBJECT //i mora imati ovo tu

public:
    Baza(QObject *parent = 0);

    // Baza();
    Baza(QString imeBaze);
    ~Baza();

public:
    int postojiPopis(QString imePopisa);
    void dodajPopis(QString imePopisa);
    void preimenujPopis(int idPopisa, QString imePopisa);
    void postaviPrioritetPopis(int idPopisa, int prioritetPopisa);
    void brisiPopis(int idPopisa);

    int postojiGrupa(QString imeGrupe);
    void dodajGrupa(QString imeGrupe);
    void preimenujGrupa(int idGrupe, QString imeGrupe);
    void postaviPrioritetGrupa(int idGrupe, int prioritetGrupe);
    void brisiGrupa(int idGrupe);
    bool praznaGrupa(int idGrupe);

    int postojiArtiklBazaIme(QString imeArtikla);
    int postojiArtiklBazaBarkod(QString barkod);

    int postojiArtiklPopisIme(QString imeArtikla, int idPopisa); //join
    int postojiArtiklPopisBarkod(QString barkod, int idPopisa);  //join

    bool postojiGrupaSviPopisi(int idGrupe); //join
    bool postojiArtiklSviPopisi(int idArtikla);

    void dodajArtiklBaza(QString imeArtikla, int idGrupe, QString barkod);
    void dodajArtiklPopis(int idArtikla, int idPopisa, float kolicina, QString mjernaJedinica);

    void preimenujArtikl(int idArtikla, QString imeArtikla);

    void brisiArtiklBaza(int idArtikla);
    void brisiArtiklPopis(int idArtikla, int idPopisa);

    void izmjenaArtiklPopis(int idArtikla, int idPopisa, float kolicina, QString mjernaJedinica);
    void prebaciArtiklBaza(int idArtikla, int idGrupe);

    void prebaciGrupe(int idIzGrupe, int idUGrupu);
    void postaviKupljenArtiklPopis(int idArtikla, int idPopisa, bool kupljen);

    bool kupljenCijeliPopis(int idPopisa);
    bool prazanPopis(int idPopisa);

    //pomocne
    void ispisiPopise();
    void ispisiGrupe();
    void ispisiArtikle();
    void ispisiSveNaPopisima();

    //vraca cijelu tablicu
    std::vector<Artikl> dajSveArtikle();
    std::vector<Popis> dajSvePopise();
    std::vector<Grupa> dajSveGrupe();
    std::vector<ElementPopisa> dajSveElementePopisa(int idPopisa);

    std::vector<Jezik> dajSveJezike();

    void odaberiJezik(int idJezika);
    Jezik dajOdabraniJezik();

    bool postojiTablica(QString imeTablice);
    void napraviPrimjerBaze();
    void pripremiJezike();

    bool jePrvoPokretanje();

    bool napraviTablice();

    int postojiArtiklPopisId(int idArtikla, int idPopisa);

private:
    bool otvoriBazu(QString imeBaze);
    bool query(QString sqlQuery);
    void ubaciSveJezike();
    void stvoriTablicuJezici();
    int dajBrojJezika();
};

#endif // BAZA_H
